<?php

    /**
     * Class Navigate_model
     */
    class Admin_model extends CI_Model
    {
        function __construct()
        {
            parent::__construct();
        }

        /**
         * 登录接口
         *
         * @param array $args
         * @param       $password
         *
         * @return array|void
         */
        function login( array $args, $password )
        {
            if ( !$args || !$password ) return P::returnError( "用户名或密码错误", "login:error_args" );

            #得到用户信息
            $admin_info = $this->getAdminInfo( $args );
            #校验用户密码
            if ( $admin_info[ 'password' ] != $this->_makePassword( $password, $admin_info[ 'salt' ] ) ) {
                return P::returnError( "用户名或密码不正确", "login:error_password" );
            }
            if ( !$admin_info[ 'status' ] ) return P::returnError( "此管理员被禁止登录" );

            #更改登录信息
            $updata_result = $this->updateAdminInfo( [ 'id' => $admin_info[ 'id' ] ], 1 );

            #得到此管理员所属组
            $groups = $this->_getGroupByAdminId( $admin_info[ 'id' ] );
            if ( !$groups )
                return P::returnError( '此用户存在但暂无用户组信息，请联系超级管理员分配组信息' );
            $admin_info[ 'groups' ] = $groups;

            #得到超级组
            $super_group = $this->_getSuperGroup();
            if ( !$super_group[ 'isok' ] ) return P::returnError( "用户信息获取失败" );

            $admin_info[ 'super_group' ] = $super_group[ 'data' ][ 'id' ];
            #判断此用户是否是超级组
            $admin_info[ 'in_super_group' ] = in_array( $super_group[ 'data' ][ 'id' ], $groups ) ? true : false;

            return P::returnOk( $admin_info );
        }

        /**
         * 得到超级组信息
         *
         * @return mixed
         */
        private function _getSuperGroup()
        {
            $super_group = $this->db->select( '*' )->from( 'auth_group' )->where( 'is_super_group', 'YES' )->get()->row_array();
            if ( !$super_group ) return P::returnError( '获取超级组失败' );

            return P::returnOk( $super_group );
        }

        /**
         * 通过管理员ID得到管理员所属组
         *
         * @param $admin_id
         *
         * @return array|bool
         */
        private function _getGroupByAdminId( $admin_id )
        {
            $groups = $this->db->select( 'auth_group.*' )->from( 'auth_group' )->join( 'auth_group_access', 'auth_group_access.uid=auth_group.id' )->where( 'uid', $admin_id )->where( 'status', 1 )->get()->result_array();
            if ( !$groups ) return false;
            $group_arr = [ ];
            foreach ( $groups as $k => $v ) {
                $group_arr[ ] = $v[ 'id' ];
            }

            return $group_arr;
        }

        /**
         * 根据管理员id得到这个管理员所属组
         * @param array $params=['admin_id'=>管理员ID]
         *
         * @return array
         */
        public function getGroupsByAdminId(array $params)
        {
            if(empty($params['admin_id'])) return P::returnArgsError('admin_id');
            extract($params);
            $return_data=self::_getGroupByAdminId($admin_id);
            if(!$return_data) return P::returnFail();
            return P::returnSuccess($return_data);
        }

        /**
         * 得到管理员信息
         *
         * @param $admin_id
         *
         * @return mixed
         */
        function getAdminInfo( array $id_or_name )
        {
            return $this->db->get_where( 'admin', $id_or_name )->row_array();
        }

        /**
         * 得到组列表
         *
         * @param $admin_id
         *
         * @return mixed
         */
        function getGroupList( $admin_id )
        {
            return $this->db->get_where( 'auth_group', [ 'id' => $admin_id ] )->result_array();
        }

        /**
         * 保存管理员组
         *
         * @param $args
         *
         * @return array
         */
        public function saveAdminGroup( $args )
        {
            if ( $id = $args[ 'id' ] ) {
                $isok = $this->db->update( 'auth_group', $args, [ 'id' => $id ] );
            } else {
                $isok = $this->db->insert( 'auth_group', $args );
            }
            if ( !$isok ) return P::returnError( "操作失败" );

            return P::returnOk();
        }

        /**
         * 生成密码
         *
         * @param        $password
         * @param string $salt
         *
         * @return array|string
         */
        private function _makePassword( $password, $salt = '' )
        {
            if ( !$password ) return false;

            return md5( $password . $salt );
        }

        /**
         * 更新管理员信息
         *
         * @param array $args
         * @param int   $is_login
         *
         * @return array
         */
        function updateAdminInfo( array $args, $is_login = 0 )
        {
            if ( !is_array( $args ) ) return P::returnError( "请传入数组", "updateAdminInfo" );
            //如果有密码
            if ( isset( $args[ 'password' ] ) ) {
                if ( $args[ 'password' ] ) {
                    $args[ 'salt' ] = T::makeString( 6 );
                    $args[ 'password' ] = $this->_makePassword( $args[ 'password' ], $args[ 'salt' ] );
                } else {
                    unset( $args[ 'password' ] );
                }
            }
            if ( $is_login ) {
                $args[ 'last_login_time' ] = date( 'Y-m-d H:i:s' );
                $args[ 'last_login_ip' ] = $this->input->ip_address();
                $this->db->set( "login_times", "login_times+1", false );
            }
            //新增
            if ( !$args[ 'id' ] ) {
                $args[ 'reg_time' ] = date( 'Y-m-d H:i:s' );
                $args[ 'reg_ip' ] = $this->input->ip_address();
                $isok = $this->db->insert( 'admin', $args );
                if ( $isok ) $args[ 'id' ] = $this->db->insert_id();
            } //更新
            else {
                $isok = $this->db->where( 'id', $args[ 'id' ] )->update( 'admin', $args );
            }
            if ( isset( $args[ 'password' ] ) ) {
                unset( $args[ 'password' ] );
                unset( $args[ 'salt' ] );
            }
            if ( !$isok ) return P::returnError( "操作用户信息失败", "updateAdminInfo:error" );

            return P::returnOk( $args );
        }

        /**
         * 得到管理员列表
         *[rows=>分页行数,start_row=>分页起始行]
         *
         * @return array
         * 管理员列表
         */
        public function getAdminList( array $args )
        {
            extract( $args );
            $result = $this->db->limit( $rows, $start_row )->select( 'id,name,display_name,email,mobile,reg_time,reg_ip,last_login_ip,last_login_time,login_times,status,desc' )->get( 'admin' )->result_array();
            return P::returnOk( $result );
        }

        /**
         * 删除管理员
         *
         * @param $id
         *
         * @return array
         */
        public function delete( array $args )
        {
            extract( $args );
            if ( !$id ) P::returnError( "参数有误" );
            $isok = $this->db->delete( 'admin', [ 'id' => $id ] );
            if ( !$isok ) P::returnError( "没有删除成功" );

            return P::returnOk();
        }

        /**
         * 得到管理员操作日志列表
         *
         * @param array $args_arr
         *[rows=>分页总行数,start_page=>起始行]
         *
         * @return mixed
         */
        public function getLogList( array $args_arr )
        {
            extract( $args_arr );
            $wheres[ 'status>=' ] = 0;
            if ( isset( $admin_id ) )
                $wheres[ 'admin_id' ] = $admin_id;
            $total = $this->db->where( $wheres )->count_all_results( 'admin_log' );
            $rows = $this->db->order_by( 'id desc' )->get_where( 'admin_log', $wheres, $rows, $start_page )->result_array();

            return P::returnOk( [ 'total' => $total, 'rows' => $rows ] );
        }

        /**
         * 删除日志
         *
         * @param array $args
         * [ids=>删除的日志id(2,4,5)]
         *
         * @return array
         */
        public function deleteAdminLog( array $args )
        {
            extract( $args );
            if ( !$ids ) return P::returnError( "参数有误" );
            $ids_arr = explode( ',', $args[ 'ids' ] );
            $isok = $this->db->where_in( 'id', $ids_arr )->update( 'admin_log', [ 'status' => -1 ] );
            if ( !$isok ) return P::returnError( "没有删除成功" );

            return P::returnOk();
        }

        /**
         * 根据管理员ID获得管理员操作权限
         *
         * @param $uid
         *
         * @return mixed
         */
        public function getOperateNodesByAdminId( array $arr )
        {
            extract( $arr );
            if ( !$uid ) return P::returnError( "请传入管理员ID" );
            $result = $this->db->select( "rules" )->where( [ 'uid' => $uid, 'status' => 1 ] )->from( "auth_group_access" )->join( "auth_group", "auth_group_access.group_id=auth_group.id", "left" )->get()->result_array();
            if ( !$result ) P::returnError( '没有可访问的节点' );
            $rules = [ ];
            foreach ( $result as $k => $v ) {
                $rules = array_unique( array_merge( $rules, explode( ",", $v[ 'rules' ] ) ) );
            }
            $result = $this->db->where( "id in (" . join( ",", $rules ) . ')' )->where( 'status', 1 )->order_by( 'listorder asc,id asc' )->get( "auth_rule" )->result_array();
            foreach ( $result as $k => &$v ) {
                if ( $v[ 'type' ] == 1 ) {
                    $v[ 'url' ] = "admin/admin/index";
                }
                $v[ 'admin_id' ] = $uid;
            }

            return $result;
        }

        /**
         * 得到管理员组列表
         *
         * @return mixed
         */
        public function getAdminGroupList( $start_row, $rows )
        {
            $db = $this->db;
            //$result = $db->limit( $rows, $start_row )->get( 'auth_group' )->result_array();
            $result = $db->select("auth_group.*,admin.name as group_leader_name")->limit( $rows, $start_row )->from( "auth_group" )->join( "admin", "admin.id=auth_group.group_leader_id", "left" )->get()->result_array();
            $counts = $db->count_all_results( 'auth_group' );

            return P::returnOk( [ 'list' => $result, 'counts' => $counts ] );
        }

        /**
         * 后台菜单管理显示菜单列表
         *
         * @return mixed
         */
        public function getRuleList( $pid = 0 )
        {
            return $this->db->get( "auth_rule" )->result_array();
        }

        /**
         * 得到导航列表
         *
         *
         *
         * @param int $pid
         *
         * @return mixed
         */
        public function getNavigateList( $pid = 0 )
        {
            $this->db->where( [ 'pid' => $pid, 'status' => 1 ] );
            $this->db->order_by( 'listorder asc,id asc' );
            $rule_list = $this->db->get( "auth_rule" )->result_array();

            return P::returnOk( $rule_list );
        }

        /**
         * @param $data
         */
        public function saveAccess( $args )
        {
            if ( $id = $args[ 'id' ] ) {
                $isok = $this->db->update( 'auth_group', $args, [ 'id' => $id ] );
            } else {
                $isok = $this->db->insert( 'auth_group', $args );
            }
            if ( !$isok ) return P::returnError( "操作失败" );

            return P::returnOk();
        }
    }

?>